//
//  CZStatus.m
//  XinLang_OC
//
//  Created by WONG on 16/3/10.
//  Copyright © 2016年 cheuhui. All rights reserved.
//

#import "CZStatus.h"
//#import "CZNetworkTool.h"
#import "CZUser.h"
#import "CZStatusDAL.h"
#import "Emoticon.h"

typedef enum{
    NormalCell, // 原创微博
    ForwardCell // 转发微博
}CZStatusReuseIdentifier;


@interface CZStatus ()

@end

@implementation CZStatus

/**
 *  字典转模型
 */
- (instancetype)initWithDict:(NSDictionary *)dict {
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}
+ (instancetype)StatusWithDict:(NSDictionary *)dict {
    return [[self alloc] initWithDict:dict];
}

- (void)setValue:(id)value forKey:(NSString *)key {
    if ([key isEqualToString:@"user"]) {
        CZUser *user = [CZUser userWithDict:value];
        self.user = user;
        //NSLog(@"user = %@",user);
        // 千万要记得return,不然会被父类从新赋值,覆盖掉了
        return;
    }
    
    if ([key isEqualToString:@"retweeted_status"]) {
        self.retweeted_status = [CZStatus StatusWithDict:value];
        return;
    }
    
    [super setValue:value forKey:key];
}
- (void)setPic_urls:(NSArray *)pic_urls {
    _pic_urls = pic_urls;
    
    for (NSDictionary *dict in _pic_urls) {
        NSString *urlString = dict[@"thumbnail_pic"];
        NSURL *url = [NSURL URLWithString:urlString];
        
        // 缩略图
        [self.storePictureURLs addObject:url];
        
        // 创建大图的NSURL
        NSString *largeURLString = [urlString stringByReplacingOccurrencesOfString:@"thumbnail" withString:@"large"];
        NSURL *largeURL = [NSURL URLWithString:largeURLString];
        
        // 大图
        [self.largeStorePictureURLs addObject:largeURL];
    }
}

- (void)setText:(NSString *)text {
    _text = text;
    
    _attrText = [Emoticon stringToEmoticonString:text];
}

/// KVC字典转模型时,字典的key在模型中找不到对应的属性时会调用,在这个方法里面可以什么都不做
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {}

- (NSString *)cellId {
    return self.retweeted_status ? @"ForwardCell" : @"NormalCell";
}
/**
 *  获取微博数据，字典转模型
 *  如果返回来的数据是 二进制，那么就要序列化
 */
+ (void)loadStatus:(void (^)(NSArray *statuses, NSError *error))finished {
    [[CZNetworkTool sharedHttpTool]loadStatus:^(id result, NSError *error) {
        if (error != nil || result == nil) {
            NSLog(@"加载微博数据失败error = %@",error);
            finished(nil, error);
            return;
        }
        //NSLog(@"加载微博数据成功result = %@",result);
        NSArray *array = result[@"statuses"];
        //NSLog(@"array = %@",array);
        
        if (array) {
            // 微博数据模型数组
            NSMutableArray *statuses = [NSMutableArray array];
            for (NSDictionary *dict in array) {
                CZStatus *status = [CZStatus StatusWithDict:dict];
                [statuses addObject:status];
            }
            
            finished(statuses, nil);
            
            // 字典转模型完成, 告诉调用者,有模型数据
            
            // 前提,图片比较小,才能缓存,如果太大,会影响用户体验
            // 单张图片要设置为图片本来的大小,服务器没有提供图片的大小,需要我们自己先将图片下载下来,缓存到本地,就可以知道图片的大小,告诉调用者获取到微博数据(通知控制器),获取到了微博数据,其他就可以拿到图片的大小了
            // 所有的图片都下载完成的时候才通知调用者获取到微博数据
            //            [self cacheWebImage:statuses finished:^(NSArray *statuses, NSError *error) {
            //                finished(statuses, nil);
            //            }];
        }else { // 没有微博数据
            finished(nil, nil);
        }
    }];
}
//+ (void)loadStatus:(NSNumber *)since_id max_id:(NSNumber *)max_id finished:(void(^)(NSMutableArray *statuses, NSError *error))finished {
//    [[CZNetworkTool sharedHttpTool] loadStatus:since_id max_id:max_id finished:^(id result, NSError *error) {
//        if (error != nil || result == nil) {
//            NSLog(@"加载微博数据失败error = %@",error);
//            finished(nil, error);
//            return;
//        }
//        //NSLog(@"加载微博数据成功result = %@",result);
//        NSArray *array = result[@"statuses"];
//        //NSLog(@"array = %@",array);
//
//        if (array) {
//            // 微博数据模型数组
//            NSMutableArray *statuses = [NSMutableArray array];
//            for (NSDictionary *dict in array) {
//                CZStatus *status = [CZStatus StatusWithDict:dict];
//                [statuses addObject:status];
//            }
//
//            finished(statuses, nil);
//
//            // 字典转模型完成, 告诉调用者,有模型数据
//
//            // 前提,图片比较小,才能缓存,如果太大,会影响用户体验
//            // 单张图片要设置为图片本来的大小,服务器没有提供图片的大小,需要我们自己先将图片下载下来,缓存到本地,就可以知道图片的大小,告诉调用者获取到微博数据(通知控制器),获取到了微博数据,其他就可以拿到图片的大小了
//            // 所有的图片都下载完成的时候才通知调用者获取到微博数据
//            //            [self cacheWebImage:statuses finished:^(NSArray *statuses, NSError *error) {
//            //                finished(statuses, nil);
//            //            }];
//        }else { // 没有微博数据
//            finished(nil, nil);
//        }
//    }];
//}

+ (void)loadStatus:(NSNumber *)since_id max_id:(NSNumber *)max_id finished:(void (^)(NSMutableArray *, NSError *))finished {
    // 调用DAL去加载数据
    [[CZStatusDAL sharedInstance] loadStatus:since_id max_id:max_id finished:^(NSArray *statuses, NSError *error) {
        // 判断是否有错误
        if (error != nil || statuses == nil) {
            NSLog(@"error = %@",error);
            finished(nil, error);
            return;
        }
        // 加载到微博数据，字典转模型
        NSMutableArray *statusArr = [NSMutableArray array];
        
        if (statuses) {
            for (NSDictionary *dict in statuses) {
                CZStatus *status = [CZStatus StatusWithDict:dict];
                [statusArr addObject:status];
            }
            finished(statusArr, nil);
        }else {
            finished(nil, nil);
        }
    }];
}

+ (void)cacheWebImage:(NSArray *)statuses finished:(void(^)(NSArray *statuses, NSError *error))finished {
    // 创建任务组
    dispatch_group_t group = dispatch_group_create();
    
    // 记录下载图片的大小
    __block NSUInteger length = 0;
    
    // 遍历每一个模型
    for (CZStatus *status in statuses) {
        NSArray *urls = status.pictureURLs;
        
        // 判断是否有图片,没有图片跳过,遍历下一个
        if (!urls) {
            // 能到这里面来,说明每有图片,跳过这个模型,遍历下一个模型
            continue;
        }
        // 说明 status.pictureURLs 不为空
        // 其实只需要缓存单张图片的情况,多张图片可以等到显示的时候在去加载,可以减少缓存图片的时间
        
        // 判断是否是单张图片
        if (urls.count == 1) {
            NSURL *url = urls[0];
            // 遍历地址,去下载图片
            
            // 使用SDWebImage去下载图片,异步下载图片
            // 让下载图片在一个任务组里面,当所有图片都下载完毕的时候,在通知我们所有图片下载完毕
            
            // 在异步任务开始之前进入组
            dispatch_group_enter(group);
            
            [[SDWebImageManager sharedManager] downloadImageWithURL:url options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                
            } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                // SDWebImage下载完毕
                // 离开组
                dispatch_group_leave(group);
                // 根据UIImage返回NSData数据
                NSData *data =  UIImagePNGRepresentation(image);
                length = length + data.length;
            }];
        }
    }
    // 监听group中的所有任务都完成, 通知一般都在主线程上面
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 所有图片下载完毕
        NSLog(@" 所有图片下载完毕：%zdM",length / 1024 / 1024);
        // 通知调用者，获取了微博数据
        finished(statuses, nil);
    });
}




// 打印对象信息
- (NSString *)description
{
    NSArray *array = @[@"created_at", @"id", @"text", @"source", @"pic_urls", @"reposts_count", @"comments_count", @"attitudes_count", @"user"];
    NSDictionary *dict = [self dictionaryWithValuesForKeys:array];
    return [NSString stringWithFormat:@"%@",dict];
}

#pragma mark - lazy load

- (NSMutableArray *)pictureURLs {
    if (!_pictureURLs) {
        _pictureURLs = [NSMutableArray array];
    }
    // 当模型是原创微博的时候返回原创微博对应的图片URL
    // 如果是转发微博,返回被转发微博的图片URL
    return self.retweeted_status == nil ? self.storePictureURLs : self.retweeted_status.storePictureURLs;
}

- (NSMutableArray<NSURL *> *)largeStorePictureURLs {
    if (!_largeStorePictureURLs) {
        _largeStorePictureURLs = [NSMutableArray array];
    }
    return _largeStorePictureURLs;
}

- (NSMutableArray<NSURL *> *)storePictureURLs {
    if (!_storePictureURLs) {
        _storePictureURLs = [NSMutableArray array];
    }
    return _storePictureURLs;
}

- (NSMutableArray<NSURL *> *)largePictureURLs {
    return self.retweeted_status == nil ? self.largeStorePictureURLs : self.retweeted_status.largeStorePictureURLs;
}

@end










